package com.mdxq.mall.user.controller;


import cn.hutool.jwt.JWT;
import cn.hutool.jwt.JWTUtil;
import com.mdxq.mall.response.R;
import com.mdxq.mall.user.dto.UserLoginDTO;
import com.mdxq.mall.user.entity.table.AdminTableDef;
import com.mdxq.mall.user.mapper.AdminMapper;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import com.mdxq.mall.user.entity.Admin;
import com.mdxq.mall.user.service.AdminService;

import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 后台用户表 控制层。
 *
 * @author DongXu
 * @since 2025-01-12
 */
@RestController
@RequestMapping("/api/v1/admin")
public class AdminController {

    @Autowired
    private AdminService adminService;
    @Autowired
    private RedisTemplate redisTemplate;
    @PostMapping("login")
    public R login(@RequestBody UserLoginDTO dto, HttpServletRequest request){
        Admin admin = adminService.login(dto.getUsername(),dto.getPassword(),request);
        if(admin!=null){
            Map<String,Object> payload = new HashMap<String,Object>(){
                {
                    put("id",admin.getId());
                    put("username",admin.getUsername());
                    put("nikeName",admin.getNickName());
                    // 将签发令牌时的系统时间戳放到payload里
                    put("iat", System.currentTimeMillis());// 令牌签发时间
                    put("exp",1*60*60*1000L);// 令牌的有效时长
                }
            };
            String token= JWTUtil.createToken(payload,"md-mall-0112".getBytes());
            // 向Redis缓存中存入用户登录生成的token
            redisTemplate.opsForValue().set(token,null);
            // 令牌在10个小时内有效
            redisTemplate.expire(token,10, TimeUnit.HOURS);
            return R.ok(token);//向客户端返回令牌
        }
        // HttpStatus.UNAUTHORIZED 表示401,未授权
        return R.error();
    }


    /**
     * 添加后台用户表。
     *
     * @param admin 后台用户表
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("save")
    public R save(@RequestBody Admin admin) {
        admin.setCreateTime(LocalDateTime.now());
        return R.ok( adminService.save(admin));
    }

    /**
     * 根据主键删除后台用户表。
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @PostMapping("remove/{id}")
    public R remove(@PathVariable Long id) {
        return R.ok(adminService.removeById(id));
    }

    /**
     * 根据主键更新后台用户表。
     *
     * @param admin 后台用户表
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PostMapping("update/{id}")
    public R update(@RequestBody Admin admin) {
        return R.ok( adminService.updateById(admin));
    }
//    @PostMapping("role/update")
//    public R allocRole(@RequestBody Admin admin) {
//        return R.ok( adminService.updateById(admin));
//    }

    @PostMapping("updateStatus/{id}")
    public R updateStatus(@RequestParam Integer status,@PathVariable Long id) {
        Admin admin = adminService.getById(id);
        if (admin !=null){
            return R.ok(true);
        }
        return R.error();
    }
//
//    @PostMapping("role/update")
//    public R updateRole(@RequestBody Admin admin) {
//        return R.ok( adminService.updateById(admin));
//    }

    /**
     * 查询所有后台用户表。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public List<Admin> list() {
        return adminService.list();
    }

    /**
     * 登出功能
     * @param token
     * @return
     */
    @PostMapping("logout")
    public R logout(@RequestHeader("Authorization") String token){
        // 之后加上Redis，需要在登出系统是，让Redis中的token过期
        redisTemplate.delete(token);
        return R.ok(true);
    }

    /**
     * 根据后台用户表主键获取详细信息。
     *
     *
     * @return 后台用户表详情
     */
    @GetMapping("getInfo")
    public R getInfo(@RequestHeader("authorization") String token) {
        // 解析请求头中的token令牌，其中获取当前登陆的管理员ID
        JWT jwt = JWTUtil.parseToken(token);
        int adminId = Integer.valueOf(jwt.getPayload("id").toString());
        Admin admin = adminService.getById(adminId);
        return R.ok(admin);
    }

    /**
     * 分页查询后台用户表。
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @Autowired
    AdminMapper adminMapper;
    @GetMapping("page")
    public R page(Page<Admin> page, String keyword) { // 添加一个参数接收实际搜索值
        QueryWrapper queryWrapper = QueryWrapper.create()
                .select()
                .from(AdminTableDef.ADMIN)
                .where(AdminTableDef.ADMIN.USERNAME.like(keyword))
                .or(AdminTableDef.ADMIN.NICK_NAME.like(keyword));
        return R.ok( adminService.page(page,queryWrapper));
    }

}
